前言

为方便管理规模不断扩大的网络,网络被分成了不同的自治系统AS(Autonomous System)。

AS是指在一个机构/企业管辖下的IP网络。

我们之前学习过的RIP、OSPF、IS-IS等都是用于AS内的,它们被统称为IGP(Interior Gateway Protocol,内部网关协议)。

1982年,外部网关协议EGP(Exterior Gateway Protocol)被用于实现在AS之间动态交换路由信息。

但是EGP设计得比较简单,只发布网络可达的路由信息,而不对路由信息进行优选,同时也没有考虑环路避免等问题,很快就无法满足网络管理的要求。

边界网关协议BGP(Border Gateway Protocol)是为取代最初的EGP而设计的另一种外部网关协议;以原理划分的话,它是一种距离矢量路由协议。

不同于最初的EGP,BGP能够进行路由优选、避免路由环路、更高效率的传递路由和维护大量的路由信息。

虽然BGP用于在AS之间传递路由信息,但并不是所有AS之间传递路由信息都需要运行BGP。

比如在数据中心上行的连入Internet的出口上,为了避免Internet海量路由对数据中心内部网络的影响,设备采用静态路由代替BGP与外部网络通信。

BGP早期发布的三个版本分别是BGP-1、BGP-2和BGP-3,1994年开始使用BGP-4,2006年至今单播IPv4网络使用的版本是BGP-4。

最新的MP-BGP用于组播网络与IPv6网段,它是对BGP-4进行了扩展,来达到在不同网络中应用的目的,BGP-4原有的消息机制和路由机制并没有改变。

MP-BGP在IPv6单播网络上的应用称为BGP4+,在IPv4组播网络上的应用称为MBGP(Multicast BGP)。

本文将介绍的是普通的BGP-4,并且不会过于深入,毕竟这是运用于超大型网络之间的路由协议;一般来说,我们在企业网内不会使用到它。

基本概念

对等体、EBGP、IBGP

在BGP中,邻居并不需要真的“邻”,只要网络可达,不管距离多少台路由器,都可以构建BGP关系。

因此在BGP中,不将构建关系的路由器称为邻居,而是叫做 “对等体(peer)”。

这个翻译确实拗口,但已经被广泛接受了。

而因为可以跨设备构建关系,同时BGP又是用于在不同AS网络之间构建路由关系的协议,所以对等体关系可以划分为两类:

  • EBGP对等体关系(External BGP Peer):指处于不同AS网络中的两台BGP设备构建的关系。
  • IBGP对等体关系(Internal BGP Peer):指处于同一个AS网络中的两台BGP设备构建的关系。

BGP的报文交互

BGP是采用TCP进行数据传输的(端口号179),这是为了跨设备、跨网络进行可靠的报文交互。

BGP对等体间通过以下5种报文进行交互,其中Keepalive报文为周期性发送,其余报文为触发式发送:

  • Open报文:用于建立BGP对等体连接。(是在TCP三次握手连接成功后,才发送Open报文。)
  • Update报文:用于在对等体之间交换路由信息。
  • Notification报文:用于中断BGP连接。
  • Keepalive报文:用于保持BGP连接。(TCP连接的特点,没有数据传输后会断开连接)
  • Route-refresh报文:用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新(Route-refresh)能力的BGP设备会发送和响应此报文。

BGP的路由

BGP与众多IGP协议最大的不同点在于,它不会自主发现路由。

不管是在RIP还是OSPF,我们宣告网段、激活接口后,协议就会自动将接口的直连路由纳入协议的路由表中。

BGP 是在整个路由器上配置的,而不是针对特定的接口,同时BGP也不会自发现直连路由。

需要人工手动配置将设备路由表中的路由信息引入到BGP路由表中,之后BGP再根据情况去使用与发布路由给其他BGP对等体。

BGP提供了两种引入路由的方式:

  • Import方式是按协议类型,将RIP、OSPF、ISIS等协议的路由引入到BGP路由表中。为了保证引入的IGP路由的有效性,Import方式还可以引入静态路由和直连路由。
  • Network方式是逐条将IP路由表中已经存在的路由引入到BGP路由表中,比Import方式更精确。
    • 其他IGP中也有这个命令,但请注意,在其他IGP协议中,network命令是用来宣告网段(指示归属该网段的接口激活该路由协议)。
    • 在BGP中,network命令是引入路由。注意,是“引入”,即路由信息是必须已经存在设备的其他路由表中,才可以使用该命令添加到BGP路由表中。

为了更好的规划网络,BGP在引入IGP的路由时,可以使用路由策略进行路由过滤和路由属性设置,也可以设置MED (Multi-Exit Discriminator)值指导EBGP对等体判断流量进入AS时选路。

BGP路由属性

在BGP路由表中,到达同一目的地可能存在多条路由。

此时BGP会选择其中一条路由作为优选路由,并只把此路由发送给其对等体。

BGP为了选出优选路由,会根据BGP的路由优选规则依次比较这些路由的BGP属性。

具体的路由优选规则我们稍后详细介绍。

路由属性是对路由的特定描述,BGP会生成/记录各种路由属性,并在传递路由信息给其他对等体时,也会携带部分路由属性。

下面介绍几种常用的BGP路由属性:

  • Origin属性

    Origin属性用来定义路径信息的来源,标记一条路由是怎么成为BGP路由的。它有以下3种类型:

    • IGP:具有最高的优先级。通过network命令注入到BGP路由表的路由,其Origin属性为IGP。
    • EGP:优先级次之。通过EGP得到的路由信息,其Origin属性为EGP。
    • Incomplete:优先级最低。通过其他方式学习到的路由信息。比如BGP通过import-route命令引入的路由,其Origin属性为Incomplete。
    • 请注意,此处说明的优先级是在比较Origin属性时的优先级;当其他比Origin属性更优先的属性比较不出孰优孰劣后才开始比较Origin属性。
  • AS_Path属性

    AS_Path属性按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。

    在接收路由时,设备如果发现AS_Path列表中有自身所在的AS号,则不接收该路由,从而避免了AS间的路由环路

    当BGP设备将自身的路由信息发送给其他对等体时:

    • 如果是通告给EBGP对等体,其Update报文中的AS_Path列表为本地AS号。
    • 如果是通告给IBGP对等体,其Update报文中的AS_Path列表为空。

    当BGP设备将从其他对等体收到的路由信息发送给其他对等体时:

    • 如果是通告给EBGP对等体,便会把本地AS编号添加在AS_Path列表的最前面(最左面)。

      收到此路由的BGP设备根据AS_Path属性就可以知道去目的地址所要经过的AS。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排列。

    • 如果是通告给IBGP对等体,不会改变这条路由相关的AS_Path属性。

  • Next_Hop属性

    Next_Hop属性记录了路由的下一跳信息。BGP的下一跳属性和IGP的有所不同,不一定就是邻居设备的IP地址。通常情况下,Next_Hop属性遵循下面的规则:

    • 如果BGP设备将路由信息通告给EBGP对等体,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
    • 如果BGP设备将自身的路由信息通告给EBGP对等体,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
    • 如果BGP设备将从EBGP对等体收到的路由信息发送给IBGP对等体,并不改变该路由信息的下一跳属性。
  • Local_Pref属性

    Local_Pref属性表明路由器的BGP优先级,用于判断流量离开AS时的优选路由

    当BGP的设备通过不同的IBGP对等体得到目的地址相同但下一跳不同的多条路由时,将优先选择Local_Pref属性值较高的路由。

    Local_Pref属性仅在IBGP对等体之间有效,不通告给其他AS。

    Local_Pref属性可以手动配置,如果路由没有配置Local_Pref属性,BGP选路时将该路由的Local_Pref值按缺省值100来处理。

  • MED属性

    MED(Multi-Exit Discriminator)属性用于判断流量进入AS时的优选路由

    当一个运行BGP的设备通过不同的EBGP对等体得到目的地址相同但下一跳不同的多条路由时,在其它条件相同的情况下,将优先选择MED值较小者作为优选路由。

    MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给任何其他第三方AS。

    MED属性可以手动配置,如果路由没有配置MED属性,BGP选路时将该路由的MED值按缺省值0来处理。

  • 团体属性

    团体属性(Community)用于标识具有相同特征的BGP路由(相当于路由tag),使路由策略的应用更加灵活,同时降低了维护管理的难度。

  • Originator_ID属性和Cluster_List属性

    Originator_ID属性和Cluster_List属性用于解决路由反射器场景中的环路问题

所有的BGP路由属性都可以分为以下4类:

  • 公认必须遵循(Well-known mandatory):所有BGP设备都可以识别此类属性,且必须存在于Update报文中。如果缺少这类属性,路由信息就会出错。
  • 公认任意(Well-known discretionary):所有BGP设备都可以识别此类属性,但不要求必须存在于Update报文中,即就算缺少这类属性,路由信息也不会出错。
  • 可选过渡(Optional transitive):BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,但它仍然会接收这类属性,并通告给其他对等体。
  • 可选非过渡(Optional non-transitive):BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,则会被忽略该属性,且不会通告给其他对等体。
属性名 类型
Origin属性 公认必须遵循
AS_Path属性 公认必须遵循
Next_Hop属性 公认必须遵循
Local_Pref属性 公认任意
MED属性 可选非过渡
团体属性 可选过渡
Originator_ID属性 可选非过渡
Cluster_List属性 可选非过渡

BGP的防环机制

AS_Path

前面提到的BGP的路由信息会携带AS_Path属性信息,用于记录路由信息经过了哪些AS网络。

如果路由器收到一条BGP路由并且发现该路由携带的AS_Path中出现了自己所在AS的AS号,它就能意识到从本地AS通告出去的BGP路由又被通告到了该AS。

如果它接收这条路由,那么就有可能引发路由环路,因此针对这种情况,BGP将忽略关于该条路由的更新,从而避免环路。

水平分割

AS_Path这个防环机制有个很明显的缺点,那就是对于同属于一个AS网络的路由器来说,它们互相传递的路由信息内的AS_Path不会变化。

就是说当BGP路由在一个AS内传递时,是无法依赖AS Path提供的防环能力的,那么此时路由环路就有可能发生,BGP水平分割规则就是用于解决这个问题的。

根据 BGP 的水平分割规则,当一个路由器从一个 IBGP 对等体学习到某条 BGP 路由时,它将不能再将这条路由通告给其他的 IBGP 对等体,但仍可以将该路由通告给其他的 EBGP 对等体。

注意:与其他路由协议里“水平分割”不同点在于,其他协议里的“水平分割”是不会发回给发送者,而BGP里是不会发送给任何IBGP路由器。

另外,因为水平分割这一特性,会出现一种问题:

当同一个AS网络内存在3台及以上的BGP路由器,并且没有两两相连,那么将无法满足“全网互通”。

比如说,R1、R2、R3串联在一起。

那么R1的路由发送给R2后,根据水平分割原则,R2不能将R1的路由发送给R3;

同理,R3的路由也无法传递给R1。

这种情况下,只能让R1与R3也构建BGP关系,让它们之间直接传递路由信息。(不要忘了,BGP是可以跨设备建立“邻居”的。)

小结

BGP通过TCP的方式可以与任何一台网络可达的路由器建立关系,如果两台路由器处于同一个AS网络,那么它们构建的是IBGP对等体;如果两台路由器处于同一个AS网络,那么它们构建的是EBGP对等体。

BGP路由器在没收到其他BGP路由器传递的路由前,其路由表为空,需要人为引入路由。

BGP设备获得路由信息后,会挑选最优路由加入BGP路由表,形成BGP路由。

BGP设备与对等体建立关系后,采取以下交互原则:

  • 从IBGP对等体获得的BGP路由,BGP设备只发布给它的EBGP对等体。
  • 从EBGP对等体获得的BGP路由,BGP设备发布给它所有EBGP和IBGP对等体。
  • 当存在多条到达同一目的地址的有效路由时,BGP设备只将最优路由发布给对等体。
  • 路由更新时,BGP设备只发送更新的BGP路由。
  • 所有对等体发送的路由,BGP设备都会接收。

路由黑洞问题

在使用BGP时,需要避免出现路由黑洞的现象。

我们之前学习过黑洞路由,那是我们人为的添加一条指向没有意义的接口(null 0)的路由信息,使得传递给指定网段的数据报文都会被丢弃。

而路由黑洞的意思是路由条目指向的是确实存在的ip地址,路由信息无误;但是路由器并没有办法前往该地址,最终丢弃数据报文。

我们实际举个例子:

如图存在两个AS网络:AS100中存在一台服务器1.1.1.1,和一台BGP路由器R1;

AS200里存在R2、R3、R4,其中只有R2与R4是BGP路由器,它们为IBGP关系。

R1与R2构建EBGP对等体关系。

在这种情景下,R1通过BGP协议将1.1.1.1的路由传递给R2,(内容为前往1.1.1.1的的下一跳为10.1.12.1)

R2再传递10.1.12.1的路由以及刚刚1.1.1.1的路由都发给R4。

当R4收到前往1.1.1.1的数据报文时,根据BGP路由表,前往前往1.1.1.1的的下一跳为10.1.12.1。而10.1.12.1再根据BGP路由表,要通过R2,再根据AS200内原有的路由表信息,前往R2去找R3。

于是R4会将数据报文发送给R3。

当R3收到了R4转发过来的前往1.1.1.1的数据报文时,它会检测路由表,发现没有前往1.1.1.1的路由,因此,它会丢弃该报文。

以上就是一种路由黑洞。

不难看出,之所以有路由黑洞,或者说我们到了讲述BGP路由协议时才提及路由黑洞的原因就是BGP协议支持跨设备构建关系

这导致了路由协议的范围不是连续的,存在于BGP网络内的路由不被R3这个非BGP路由器感知,进而导致数据报文的路由在它这里中断。

解决方法有两种:

  • 一是让R3也成为BGP路由器,R2与R3构建关系,R3与R4也构建关系。
  • 二是让R2将到达R1的路由引入到AS200原有的网络中来。

此外还有一种另类的解决方法,通过MPLS传递数据报文。MPLS报文不使用传统的路由方式,而是根据标签进行传递,但这很另类,而且我们也还没介绍MPLS,因此暂且不提。

方法二很好理解,但请注意,BGP的路由表非常庞大,引入BGP路由需要做好路由策略过滤到大量不需要的路由。

而方法一实际就是让路线上所有的路由器都两两构建关系。

在我们这个案例中设备很少,但实际现网中,可能存在大量的设备。

假设在一个AS内部有n台设备,那么建立的IBGP连接数就为n(n-1)/2。

而BGP作为跨设备连接的协议,其配置需要手动输入连接方的ip地址;

如果要配置大量的BGP关系,那将非常的繁琐麻烦,而且配置后网络资源和CPU资源的消耗都很大。

为此,BGP新增两种机制来处理这个问题——反射器与联邦。

反射器

为了更好的介绍反射器,我们将刚刚的拓扑略作修改:

反射器的起名源于其机制类似镜子的反射,不过我认为称作复读机会更加形象。

如果在以上拓扑结构里,配置R2与R3、R3与R4、R3与R5之间构建IBGP关系;接着在R3上配置R3为反射器,R2、R4、R5为客户机。

那么当R2将服务器与R1的路由发送给R3时,R3会将这些路由复读给R4、R5。

再加上未配置BGP之前,AS200内部R2、R3、R4、R5之间已经通过其他路由协议实现全网互通了。

最终R4与R5也能访问到服务器。(去服务器找R1——去R1找R2——去R2查找原有路由表。)

反射器中的术语:

  • 路由反射器RR(Route Reflector):允许把从IBGP对等体学到的路由反射到其他IBGP对等体的BGP设备,类似OSPF网络中的DR。
  • 客户机(Client):与RR形成反射邻居关系的IBGP设备。在AS内部客户机只需要与RR直连。
  • 非客户机(Non-Client):既不是RR也不是客户机的IBGP设备。在AS内部非客户机与RR之间,以及所有的非客户机之间仍然必须建立全连接关系。
  • 始发者(Originator):在AS内部始发路由的设备(记录的router-id)。Originator_ID属性用于防止集群内产生路由环路。(与AS_Path作用类似)
  • 集群(Cluster):路由反射器及其客户机的集合。Cluster_List属性用于防止集群间产生路由环路。(与AS_Path作用类似)

反射器的反射规则:

  • 从非客户机学到的路由,发布给所有客户机。
  • 从客户机学到的路由,发布给除了该客户机外的所有非客户机和客户机。
  • 从EBGP对等体学到的路由,发布给所有的非客户机和客户机。

联邦

联邦更好理解了,我们之所以要对同一AS网络下的BGP路由器进行两两互相构建关系,就是为了防环机制。

  • AS_Path只能作用于不同AS之间,因此同一AS网络下需要依靠水平分割机制
  • 水平分割机制让IBGP只能两两之间互传,无法越过其中一台路由器传给第三者。

而联邦就是将一个AS网络划分成多个小AS网络。从而使得虽然表面都是同一个AS网络,但是设备之间构建的是EBGP关系,因此可以使用AS_Path进行标记,进而做到防环,且无需遵循水平分割机制。

当我们对某一AS网络下的部分路由器进行联邦划分,划分了多个小AS。

原本的AS号就成为了它们的联邦AS (Confederation AS),而划分出的小AS就是成员AS(Member AS)。

成员AS只在联邦AS内生效,联邦外的路由器不感知成员AS;联邦边缘的成员路由器在对外时会直接使用联邦AS,而不再使用成员AS。

上图是对一AS进行联邦划分后,路由传递过程中,AS_Path变化的展示图:

  1. R1的路由要传递给R3,AS_Path便标记上R1所在的AS100。

  2. R3与R4同属于一个AS,关系是IBGP,因此AS_Path属性不变。

  3. R4要传递路由给R5,因为R4处于联邦成员AS64512,因此AS_Path里在左侧新增上该AS号。

  4. R5要传递给R6,因为又是跨成员AS传递了,AS_Path就再一次在左侧新增上R6所处的成员AS号;

  5. R5要传递给R2,因为这是要传递给联邦外的设备,因此R5会将AS_Path内的成员AS号都删除,修改为联邦AS号。

    BGP在AS_Path内定义了多个类型用以区分一个AS号是普通AS号,还是联邦成员AS号。图中就以括号的形式代为表示。

BGP路由优先规则

当到达同一目的地存在多条路由时,BGP依次对比下列属性来选择路由:

  1. (可忽略)优选协议首选值(PrefVal)最高的路由。

    协议首选值(PrefVal)是华为设备的特有属性,该属性仅在本地有效。

  2. 优选本地优先级(Local_Pref)最高的路由。

    如果路由没有本地优先级,BGP选路时将该路由按缺省的本地优先级100来处理。

  3. 依次优选手动聚合路由、自动聚合路由、network命令引入的路由、import-route命令引入的路由。

  4. 优选AS路径(AS_Path)最短的路由。

  5. 依次优选Origin属性为IGP、EGP、Incomplete的路由。

  6. 对于来自同一AS的路由,优选MED值最低的路由。

  7. 依次优选EBGP路由、IBGP路由、LocalCross路由、RemoteCross路由。

  8. 优选到BGP下一跳IGP度量值(metric)最小的路由。

    在IGP中,对到达同一目的地址的不同路由,IGP根据本身的路由算法计算路由的度量值。

  9. 优选Cluster_List最短的路由。

  10. 优选Router ID最小的设备发布的路由。

    如果路由携带Originator_ID属性,选路过程中将比较Originator_ID的大小(不再比较Router ID),并优选Originator_ID最小的路由。

  11. 优选从具有最小IP Address的对等体学来的路由。

以上为方便查看的简略说明,接下面我们逐条进行分析。

0.优选协议首选值(PrefVal)最高的路由

这是华为设备中自行定义的属性值,只作用于设备本身,对外传递的BGP路由不会添加该信息。

这个属性值的作用就是让管理员可以人为的确定某条路由一定是最优的。

1.优选本地优先级(Local_Pref)最高的路由

单纯的确定优先级的属性值。

默认为100,如果手动修改该值,则该值会跟随路由一起发给其他路由器。

2.优先本地发布的路由

实际上第二条就是标题这个意思,优先BGP设备自己持有的路由(也就是我们进行配置而产生的路由)。

在这些路由里,再以”手动聚合路由、自动聚合路由、network命令引入的路由、import-route命令引入的路由、“的顺序进行优选。

3.优选AS路径(AS_Path)最短的路由。

也很好理解,路径最短,则大概率最优。

4.依次优选Origin属性为IGP、EGP、Incomplete的路由。

Origin属性用来定义路径信息的来源,标记一条路由是怎么成为BGP路由的。它有以下3种类型:

  • IGP:具有最高的优先级。通过network命令注入到BGP路由表的路由
  • EGP:优先级次之。通过EGP得到的路由信息
  • Incomplete:优先级最低。通过其他方式学习到的路由信息。比如BGP通过import-route命令引入的路由
  • 请注意,此处的IGP是内部网关协议,也就是表示RIP、OSPF在内的一类路由协议。EGP是外部网关协议,是指已经被淘汰的EGP(BGP的前身)。

注意,如果在优选规则第二项都没选出最优路由来,那么就说明现在需要进行优选的这些路由都不是本地发布的路由,都是从其他路由器那里收到的。另外,越过了第三项优选规则后,此时更看重的不是路径长度了,而是路由是否稳定、可靠、可信任。

  • Origin属性为IGP的,因为通过 IGP 学习到的路由信息是在本地网络内部生成的,同时这种路由信息来源于本地网络,也是最可信的。
  • Origin属性为EGP的,虽然现在很少使用 EGP,但通过 EGP 学习到的路由信息仍然被认为比 Incomplete 类型的路由信息更可信。
  • Origin属性为Incomplete的,这种路由信息的来源不明确,可能来自其他协议或手动配置,因此被认为是最不可信的。

5.对于来自同一AS的路由,优选MED值最低的路由。

匹配到这,目标差不多已经开始不是选出最优的路由,而是为了选出路由了。

MED 值通常是手工配置的,可以通过网络管理员手动设置。

如果未手动配置MED值,它的默认值是 0

当BGP路由器在选择最佳路径时考虑MED值时,会选择具有最低MED值的路由作为最佳路径。

6.依次优选EBGP路由、IBGP路由、LocalCross路由、RemoteCross路由。

PE上某个VPN实例的VPNv4路由的ERT匹配其他VPN实例的IRT后复制到该VPN实例,称为LocalCross;

从远端PE学习到的VPNv4路由的ERT匹配某个VPN实例的IRT后复制到该VPN实例,称为RemoteCross。

7.优选到BGP下一跳IGP度量值(metric)最小的路由。

还是提醒一下,这里说的IGP是包括RIP、OSPF在内的内部网关协议。

此处就是优选前往路由的下一跳的路由,其度量值最小的那个。(第一个“路由”是说的优选中的BGP路由,第二个“路由”是指IGP路由表中的路由)

8.优选Cluster_List最短的路由。

这里说的是反射器集合。

9.优选Router ID最小的设备发布的路由。

一般来说,router-id都是唯一的。

另外,如果路由携带Originator_ID属性,选路过程中将比较Originator_ID的大小(不再比较Router ID),并优选Originator_ID最小的路由。

10.优选从具有最小IP Address的对等体学来的路由。

如果router-id有冲突了,那就再根据ip地址比较,至少能构建关系,传递路由,说明ip地址没有冲突。

配置

基础配置

  1. 执行命令system-view,进入系统视图。

  2. 执行命令bgp as-number-plain ,启动BGP,指定本地AS编号,并进入BGP视图。

  3. (可选)根据网络类型,选择进入不同地址族视图,配置不同类型网络中的BGP设备。

    • 执行命令ipv4-family { unicast | multicast },进入IPv4地址族视图,默认为此模式。
    • 执行命令ipv6-family [ unicast ],进入IPv6地址族视图。
  4. 执行命令router-id ipv4-address,配置BGP的Router ID。

    如果选中的Router ID是物理接口的IP地址,当IP地址发生变化时,会引起路由的振荡。为了提高网络的稳定性,可以将Router ID手动配置为Loopback接口地址。

  5. 执行命令peer ip-address as-number,指定邻居对等体,ip地址与AS号都是填写目标BGP设备的信息。

  6. (可选)执行命令peer ipv4-address next-hop-local,配置BGP设备向指定IBGP对等体发布路由时,把下一跳地址设为自身的IP地址。

    默认情况下,BGP设备向IBGP对等体发布路由时,不修改下一跳地址。在大型网络中,IBGP对等体可能无法直接访问原始下一跳地址,配置此命令可确保路由可达。(某些场景下,可直接配置反射器实现相同的作用)

  7. (可选)执行命令peer ip-address connect-interface interface-type interface-number [ ip-source-address ],指定发送BGP报文的源接口,并可指定发起连接时使用的源ip地址。

    默认情况下,都是使用到达目标BGP设备的路由信息指定的出接口作为BGP报文的源接口。

  8. (可选)执行命令peer ip-address ebgp-max-hop [ hop-count ],指定建立EBGP连接允许的最大跳数。

    默认情况下,EBGP连接允许的最大跳数为1,即只能在物理直连链路上建立EBGP连接。

配置路由引入

Import方式

  1. 执行命令system-view,进入系统视图。

  2. 执行命令bgp as-numbe ,进入BGP视图。

  3. 执行命令import-route protocol [ process-id ] [ med med | route-policy route-policy-name ] ,配置BGP引入其他协议的路由。

    可选配置MED属性(度量值)与进行路由策略过滤。

  4. (可选)执行命令default-route imported允许BGP引入本地IP路由表中已经存在的默认路由。

    默认情况下,BGP不能将其他路由协议内的缺省路由引入到BGP路由表中,配置此命令是允许这个操作,也就是说实际还是得需要引入的路由协议内的路由表已经存在默认路由才行。

Network方式

  1. 执行命令system-view,进入系统视图。
  2. 执行命令bgp as-numbe ,进入BGP视图。
  3. 执行命令network ip-address [ mask | mask-length ] [ route-policy route-policy-name ],配置BGP逐条引入IP路由表中的路由。

配置反射器

注意,配置反射器只需要在成为反射器的那一台设备上进行配置,无法去客户机上配置。

  1. 执行命令system-view,进入系统视图。

  2. 执行命令bgp as-numbe ,进入BGP视图。

  3. 执行命令peer { group-name | ip-address } reflect-client,配置路由反射器的客户。

    该命令一配置,即表示该设备成为一台反射器。同时再去设定指定的设备成为“我”的客户。

  4. (可选)在路由反射器上执行命令reflector cluster-id cluster-id,配置路由反射器的集群ID。

    默认情况下,每个路由反射器使用自己的Router ID作为集群ID。

  5. (可选)执行命令undo reflect between-clients,禁止客户机之间的路由反射。

    默认情况下,路由反射器会将从一个客户机学到的路由反射给其他客户机,这就是”客户机之间的路由反射”。

    启用此命令后,路由反射器收到客户机传来的路由,只会将其反射给非客户机的IBGP对等体。

  6. (可选)执行命令routing-table rib-only [ route-policy route-policy-name ],禁止BGP将优选的路由下发到IP路由表。

    默认情况下,BGP将优选的路由下发到IP路由表。

配置联邦

  1. 执行命令system-view,进入系统视图。
  2. 执行命令bgp as-numbe ,进入BGP视图,配置所属的联邦成员AS号。
  3. 执行命令confederation id as-number,配置联邦AS号。
  4. 执行命令confederation peer-as as-number ,指定属于同一个联盟的相邻成员AS号。

注意:一共出现了三次AS号配置,它们都是不同的,注意区分清楚。

尤其是创建并进入BGP视图的地方,是输入的成员AS号,并非联邦AS号。

案例实验

案例一

我们先从简单一点的开始,顺便也做完整一点,从0开始搭建。

这是之前软考题中的一副拓扑图:某网络拓扑如图所示,路由器R1、R2、R3通过OSPF实现网络互通,R1和R3建立iBGP邻居关系,R3和R5建立eBGP邻居关系,R1和R4建立eBGP邻居关系。

虚线为表示R1与R3构建了IBGP关系,实际物理上不存在该链路。

配置校园网内R1、R2、R3的OSPF网络互通:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Huawei>system-view 
[Huawei]sysname R1

[R1]interface GigabitEthernet 0/0/0
[R1-GigabitEthernet0/0/0]ip address 192.168.12.1 24
[R1-GigabitEthernet0/0/0]q

[R1]interface LoopBack 0
[R1-LoopBack0]ip address 1.1.1.1 24
[R1-LoopBack0]q

[R1]ospf 1 router-id 1.1.1.1
[R1-ospf-1]area 0
[R1-ospf-1-area-0.0.0.0]network 1.1.1.1 0.0.0.0
[R1-ospf-1-area-0.0.0.0]network 192.168.12.0 0.0.0.255
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<Huawei>system-view 
[Huawei]sysname R2

[R2]interface GigabitEthernet 0/0/0
[R2-GigabitEthernet0/0/0]ip address 192.168.12.2 24
[R2-GigabitEthernet0/0/0]q

[R2]interface GigabitEthernet 0/0/1
[R2-GigabitEthernet0/0/1]ip address 192.168.23.2 24
[R2-GigabitEthernet0/0/1]q

[R2]interface LoopBack 0
[R2-LoopBack0]ip address 2.2.2.2 24
[R2-LoopBack0]q

[R2]ospf 1 router-id 2.2.2.2
[R2-ospf-1]area 0
[R2-ospf-1-area-0.0.0.0]network 2.2.2.2 0.0.0.0
[R2-ospf-1-area-0.0.0.0]network 192.168.12.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0]network 192.168.23.0 0.0.0.255
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Huawei>system-view 
[Huawei]sysname R3

[R3]interface GigabitEthernet 0/0/0
[R3-GigabitEthernet0/0/0]ip address 192.168.23.3 24
[R3-GigabitEthernet0/0/0]q

[R3]interface LoopBack 0
[R3-LoopBack0]ip address 3.3.3.3 24
[R3-LoopBack0]q

[R3]ospf 1 router-id 3.3.3.3
[R3-ospf-1]area 0
[R3-ospf-1-area-0.0.0.0]network 3.3.3.3 0.0.0.0
[R3-ospf-1-area-0.0.0.0]network 192.168.23.3 0.0.0.255
[R3-ospf-1-area-0.0.0.0]q

配置完后,验证一下,R3可以ping通R1的回环地址1.1.1.1。(就不查路由表了)

1
2
3
4
5
6
7
8
9
10
11
12
13
[R3]ping 1.1.1.1
PING 1.1.1.1: 56 data bytes, press CTRL_C to break
Reply from 1.1.1.1: bytes=56 Sequence=1 ttl=254 time=40 ms
Reply from 1.1.1.1: bytes=56 Sequence=2 ttl=254 time=30 ms
Reply from 1.1.1.1: bytes=56 Sequence=3 ttl=254 time=30 ms
Reply from 1.1.1.1: bytes=56 Sequence=4 ttl=254 time=20 ms
Reply from 1.1.1.1: bytes=56 Sequence=5 ttl=254 time=20 ms

--- 1.1.1.1 ping statistics ---
5 packet(s) transmitted
5 packet(s) received
0.00% packet loss
round-trip min/avg/max = 20/28/40 ms

配置与R4、R5构建BGP网络

R1与R4:

1
2
3
4
5
6
7
8
<R1>system-view 
[R1]interface GigabitEthernet 0/0/1
[R1-GigabitEthernet0/0/1]ip address 10.14.14.1 24
[R1-GigabitEthernet0/0/1]q

[R1]bgp 100
[R1-bgp]peer 10.14.14.4 as
[R1-bgp]peer 10.14.14.4 as-number 200
1
2
3
4
5
6
7
8
9
10
11
12
13
<Huawei>system-view 
[Huawei]sysname R4
[R4]interface g0/0/0
[R4-GigabitEthernet0/0/0]ip address 10.14.14.4 24
[R4-GigabitEthernet0/0/0]q

[R4]interface LoopBack 0
[R4-LoopBack0]ip address 210.23.3.4 32
[R4-LoopBack0]q

[R4]bgp 200
[R4-bgp]peer 10.14.14.1 as-number 100
[R4-bgp]q

由于AS号不相同,因此会判断处于不同的AS网络,构建EBGP对等体关系。

我们可以检验一下:

  • display bgp peer 为检查所有邻居对等体的简要信息;
  • display bgp peer 10.14.14.4 verbose为检查指定邻居对等体的详细信息。(其中可以看到Type: EBGP link
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
[R1]display bgp peer

BGP local router ID : 192.168.12.1
Local AS number : 100
Total number of peers : 1 Peers in established state : 1

Peer V AS MsgRcvd MsgSent OutQ Up/Down State PrefRcv
10.14.14.4 4 200 5 6 0 00:03:27 Established 0

[R1]display bgp peer 10.14.14.4 verbose

BGP Peer is 10.14.14.4, remote AS 200
Type: EBGP link
BGP version 4, Remote router ID 10.14.14.4
Update-group ID: 1
BGP current state: Established, Up for 00h05m58s
BGP current event: RecvKeepalive
BGP last state: OpenConfirm
BGP Peer Up count: 1
Received total routes: 0
Received active routes total: 0
Advertised total routes: 0
Port: Local - 179 Remote - 50885
Configured: Connect-retry Time: 32 sec
Configured: Active Hold Time: 180 sec Keepalive Time:60 sec
Received : Active Hold Time: 180 sec
Negotiated: Active Hold Time: 180 sec Keepalive Time:60 sec
Peer optional capabilities:
Peer supports bgp multi-protocol extension
Peer supports bgp route refresh capability
Peer supports bgp 4-byte-as capability
Address family IPv4 Unicast: advertised and received
Received: Total 7 messages
Update messages 0
Open messages 1
KeepAlive messages 6
Notification messages 0
Refresh messages 0
Sent: Total 8 messages
Update messages 0
Open messages 2
KeepAlive messages 6
Notification messages 0
Refresh messages 0
Authentication type configured: None
Last keepalive received: 2024/07/25 16:58:09 UTC-08:00
Last keepalive sent : 2024/07/25 16:58:09 UTC-08:00
Minimum route advertisement interval is 30 seconds
Optional capabilities:
Route refresh capability has been enabled
4-byte-as capability has been enabled
Peer Preferred Value: 0
Routing policy configured:
No routing policy is configured

接着配置R1与R3的BGP关系:

1
2
3
<R1>system-view 
[R1]bgp 100
[R1-bgp]peer 192.168.23.3 as-number 100
1
2
3
<R3>system-view 
[R3]bgp 100
[R3-bgp]peer 192.168.12.1 as-number 100

检查一下R1的bgp邻居对等体列表:

1
2
3
4
5
6
7
8
9
[R1]display bgp peer

BGP local router ID : 192.168.12.1
Local AS number : 100
Total number of peers : 2 Peers in established state : 2

Peer V AS MsgRcvd MsgSent OutQ Up/Down State PrefRcv
10.14.14.4 4 200 18 19 0 00:16:47 Established 0
192.168.23.3 4 100 2 3 0 00:00:15 Established 0

状态已经Established了,关系建立完毕;再检查详细信息,其Type: IBGP link(就不贴出来了,详细信息太长了)

R3与R5

1
2
3
4
5
6
7
<R3>system-view 
[R3]interface g0/0/1
[R3-GigabitEthernet0/0/1]ip address 10.35.35.3 24
[R3-GigabitEthernet0/0/1]q

[R3]bgp 100
[R3-bgp]peer 10.35.35.5 as-number 300
1
2
3
4
5
6
7
8
9
<Huawei>system-view 
[Huawei]sysname R5

[R5]interface g0/0/0
[R5-GigabitEthernet0/0/0]ip address 10.35.35.5 24
[R5-GigabitEthernet0/0/0]q

[R5]bgp 300
[R5-bgp]peer 10.35.35.3 as-number 100

在R4上引入路由,并解决无路由问题

我们将R4上的210.23.3.4 /32引入到BGP网络中,让其他BGP设备都能学习到该路由。

1
2
[R4]bgp 200
[R4-bgp]network 210.23.3.4 32

这时,我们去R3上检查bgp路由表:

1
2
3
4
5
6
7
8
9
10
11
[R3]display bgp routing-table 

BGP Local router ID is 192.168.23.3
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete


Total Number of Routes: 1
Network NextHop MED LocPrf PrefVal Path/Ogn
i 210.23.3.4/32 10.14.14.4 0 100 0 200i

可以发现R4引入的210.23.3.4 /32路由已经被R3获取并加入到其bgp路由表中。

不过,在R5上却检查不到该路由信息,并且如果在链路上进行抓包的话,能够发现R3不会发送路由给R5,也就是说问题出在R3上。

这是因为对于R3来说,它获得的路由信息是NextHop=10.14.14.4,而实际它并没有前往10.14.14.4网段的路由信息,因此它认为该路由是无效的,于是就不会将该路由发送给R5。

想解决这个问题,很简单,我们可以在R1上引入路由,但是这并不够通用。

最好的解决方式是在R1上配置传递路由是将NextHop修改为本身。

1
2
3
<R1>system-view 
[R1]bgp 100
[R1-bgp]peer 192.168.23.3 next-hop-local

再检查R3的路由表就可以看到NextHop=192.168.12.1

而对于R3来说,它是知道如何前往192.168.12.1的(通过OSPF路由表),因此它就认为这条BGP路由是有效的,便会传递给R5了。

1
2
3
4
5
6
7
8
9
10
11
[R3]display bgp routing-table 

BGP Local router ID is 192.168.23.3
Status codes: * - valid, > - best, d - damped,
h - history, i - internal, s - suppressed, S - Stale
Origin : i - IGP, e - EGP, ? - incomplete


Total Number of Routes: 1
Network NextHop MED LocPrf PrefVal Path/Ogn
*>i 210.23.3.4/32 192.168.12.1 0 100 0 200i

解决路由黑洞问题——反射器

理论上,R5已经持有210.23.3.4的路由信息了,并且下一跳是可达的,那么应该能够访问210.23.3.4。

让我们一步步分析一下:

  1. R5根据bgp路由,查到210.23.3.4的NextHop=10.35.35.3,也就是R3,将数据报文发送给R3。

  2. R3再经过路由迭代,最终将R5访问210.23.3.4的报文传递给R2。

    先根据bgp路由查到210.23.3.4的NextHop=192.168.12.1,再根据OSPF路由查到192.168.12.1的NextHop=192.168.23.2,也就是R2

  3. R2检查其路由表,并没有找到前往210.23.3.4的路由,因此会将数据报文丢弃,也就是在R2处形成了路由黑洞。

要解决这个问题,可以配置R1与R2构建BGP关系,R2与R3也构建BGP关系。

也可以只配置R1与R2构建BGP关系,然后将R1配置为反射器。

我们这边就演示反射器的配置。

首先配置R2与R1构建BGP关系

1
2
3
<R2>system-view 
[R2]bgp 100
[R2-bgp]peer 192.168.12.1 as-number 100

接着配置反射器与客户:

1
2
3
4
5
6
7
<R1>system-view 
[R1]bgp 100
[R1-bgp]peer 192.168.12.2 as-number 100
[R1-bgp]peer 192.168.12.2 next-hop-local

[R1-bgp]peer 192.168.12.2 reflect-client
[R1-bgp]peer 192.168.23.3 reflect-client

请注意,不要忘了新配置R2作为R1的对等体后,配置next-hop-local

经过以上配置,AS 100内所有路由器都有了到达210.23.3.4的路由信息了。

但通信是双向的,我们还需要为R4准备好路由。

1
2
3
<R1>system-view 
[R1]bgp 100
[R1-bgp]import-route ospf 1

配置完后,我们在R3上测试一下,已经可以与210.23.3.4互通了。

1
2
3
4
5
6
7
8
9
10
11
12
13
[R3]ping 210.23.3.4
PING 210.23.3.4: 56 data bytes, press CTRL_C to break
Reply from 210.23.3.4: bytes=56 Sequence=1 ttl=253 time=30 ms
Reply from 210.23.3.4: bytes=56 Sequence=2 ttl=253 time=40 ms
Reply from 210.23.3.4: bytes=56 Sequence=3 ttl=253 time=40 ms
Reply from 210.23.3.4: bytes=56 Sequence=4 ttl=253 time=40 ms
Reply from 210.23.3.4: bytes=56 Sequence=5 ttl=253 time=30 ms

--- 210.23.3.4 ping statistics ---
5 packet(s) transmitted
5 packet(s) received
0.00% packet loss
round-trip min/avg/max = 30/36/40 ms

但R5还不行,因为R1依旧还是没有R5的路由信息。

我们需要在R3上引入到达R5=10.35.35.5的路由信息。

1
2
[R3]bgp 100
[R3-bgp]network 10.35.35.5 24

引入完成后,在R5上进行测试,可以ping通210.23.3.4了。

1
2
3
4
5
6
7
8
9
10
11
12
13
[R5]ping 210.23.3.4
PING 210.23.3.4: 56 data bytes, press CTRL_C to break
Reply from 210.23.3.4: bytes=56 Sequence=1 ttl=252 time=50 ms
Reply from 210.23.3.4: bytes=56 Sequence=2 ttl=252 time=50 ms
Reply from 210.23.3.4: bytes=56 Sequence=3 ttl=252 time=40 ms
Reply from 210.23.3.4: bytes=56 Sequence=4 ttl=252 time=30 ms
Reply from 210.23.3.4: bytes=56 Sequence=5 ttl=252 time=50 ms

--- 210.23.3.4 ping statistics ---
5 packet(s) transmitted
5 packet(s) received
0.00% packet loss
round-trip min/avg/max = 30/44/50 ms

总结

ASBR往自己AS内部传递路由最好是配置next-hop-local,避免AS内部的BGP路由器因无法路由到外部AS而放弃路由。

AS内部如果跨设备构建BGP对等体关系,则需要确认物理链路上的所有路由器是否有对应路由,避免出现路由黑洞。

解决路由黑洞的方式有配置全互联或者配置反射器。